package com.test;

import com.spark.client.SparkClient;
import com.spark.client.config.SparkConfig;
import com.spark.client.exception.SparkClientException;
import com.spark.client.model.SparkResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.Resource;

/**
 * 测试应用 - 演示如何使用 SparkClient jar 包
 */
@SpringBootApplication
public class SparkClientTestApp implements CommandLineRunner {

    @Autowired
    private SparkClient sparkClient;

    @Resource
    private SparkConfig sparkConfig;

    public static void main(String[] args) {
        System.out.println("=== SparkClient Jar 包测试应用 ===");
        SpringApplication.run(SparkClientTestApp.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("\n=== 开始测试 SparkClient jar 包 ===");
        
        // 显示配置信息
        showConfiguration();
        
        // 测试1: 基本对话
        testBasicChat();
//
//        // 测试2: 链式调用
//        testBuilderPattern();
//
//        // 测试3: 流式调用
//        testStreamChat();
//
//        // 测试4: 简化方法
//        testSimplifiedMethods();
//
//        // 测试5: 依赖注入
//        testDependencyInjection();
//
//        System.out.println("\n=== SparkClient jar 包测试完成 ===");
    }
    
    /**
     * 显示配置信息
     */
    private void showConfiguration() {
        System.out.println("\n--- 配置信息 ---");
        System.out.println("API Key: " + maskApiKey(sparkConfig.getApiKey()));
        System.out.println("模型: " + sparkConfig.getModel());
        System.out.println("最大 Tokens: " + sparkConfig.getMaxTokens());
        System.out.println("温度: " + sparkConfig.getTemperature());
        System.out.println("基础 URL: " + sparkConfig.getBaseUrl());
        System.out.println("启用日志: " + sparkConfig.getEnableLogging());
    }
    
    /**
     * 测试基本对话
     */
    private void testBasicChat() {
        System.out.println("\n--- 测试1: 使用自动注入的 SparkClient ---");
        
        try {
            SparkResponse response = sparkClient.chat("你好，请简单介绍一下你自己，不超过50字");
            
            if (response.getCode() != null && response.getCode() == 0) {
                if (response.getChoices() != null && !response.getChoices().isEmpty()) {
                    String content = response.getChoices().get(0).getMessage().getContent();
                    System.out.println("✅ 基本对话测试成功");
                    System.out.println("问题: 你好，请简单介绍一下你自己，不超过50字");
                    System.out.println("回答: " + content);
                    
                    // 显示 Token 使用情况
                    if (response.getUsage() != null) {
                        System.out.println("Token 使用: 输入=" + response.getUsage().getPromptTokens() + 
                                         ", 输出=" + response.getUsage().getCompletionTokens() + 
                                         ", 总计=" + response.getUsage().getTotalTokens());
                    }
                } else {
                    System.err.println("❌ 响应中没有内容");
                }
            } else {
                System.err.println("❌ API 返回错误: " + response.getMessage());
            }
            
        } catch (SparkClientException e) {
            System.err.println("❌ 基本对话测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 测试链式调用
     */
    private void testBuilderPattern() {
        System.out.println("\n--- 测试2: 使用 Builder 模式 ---");
        
        try {
            SparkClient client = SparkClient.builder(sparkConfig)
                    .model("4.0Ultra")
                    .temperature(0.8)
                    .maxTokens(1024)
                    .systemMessage("你是一个专业的Java编程导师")
                    .userMessage("请用一句话解释什么是Spring Boot")
                    .build();
            
            SparkResponse response = client.chat();
            
            if (response.getCode() != null && response.getCode() == 0) {
                if (response.getChoices() != null && !response.getChoices().isEmpty()) {
                    String content = response.getChoices().get(0).getMessage().getContent();
                    System.out.println("✅ 链式调用测试成功");
                    System.out.println("系统角色: 你是一个专业的Java编程导师");
                    System.out.println("问题: 请用一句话解释什么是Spring Boot");
                    System.out.println("回答: " + content);
                } else {
                    System.err.println("❌ 响应中没有内容");
                }
            } else {
                System.err.println("❌ API 返回错误: " + response.getMessage());
            }
            
        } catch (SparkClientException e) {
            System.err.println("❌ 链式调用测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 测试流式调用
     */
    private void testStreamChat() {
        System.out.println("\n--- 测试3: 流式调用 ---");
        
        try {
            SparkClient client = SparkClient.builder(sparkConfig)
                    .stream()
                    .userMessage("请写一首关于编程的短诗，4行即可")
                    .build();
            
            System.out.println("✅ 开始流式输出:");
            System.out.print("AI 回复: ");
            
            StringBuilder fullResponse = new StringBuilder();
            
            client.chatStream(response -> {
                if (response.getChoices() != null && !response.getChoices().isEmpty()) {
                    SparkResponse.Choice choice = response.getChoices().get(0);
                    if (choice.getDelta() != null && choice.getDelta().getContent() != null) {
                        String content = choice.getDelta().getContent();
                        fullResponse.append(content);
                        System.out.print(content); // 实时输出
                    }
                }
            });
            
            System.out.println(); // 换行
            System.out.println("✅ 流式调用测试成功");
            System.out.println("完整回复: " + fullResponse.toString());
            
        } catch (SparkClientException e) {
            System.err.println("❌ 流式调用测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 测试简化方法
     */
    private void testSimplifiedMethods() {
        System.out.println("\n--- 测试4: 简化方法 ---");

        try {
            // 测试 chatForContent 方法
            String content = sparkClient.chatForContent("请用一句话介绍Java语言");
            System.out.println("✅ chatForContent 测试成功");
            System.out.println("问题: 请用一句话介绍Java语言");
            System.out.println("回答: " + content);

        } catch (SparkClientException e) {
            System.err.println("❌ 简化方法测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 测试流式简化方法
     */
    private void testStreamSimplified() {
        System.out.println("\n--- 测试流式简化方法 ---");

        try {
            SparkClient client = SparkClient.builder(sparkConfig)
                    .stream()
                    .build();

            System.out.println("✅ 开始流式简化输出:");
            System.out.print("AI 回复: ");

            StringBuilder fullResponse = new StringBuilder();

            client.chatStreamForContent("请写一首关于编程的短诗，4行即可", content -> {
                fullResponse.append(content);
                System.out.print(content); // 实时输出
            });

            System.out.println(); // 换行
            System.out.println("✅ 流式简化方法测试成功");
            System.out.println("完整回复: " + fullResponse.toString());

        } catch (SparkClientException e) {
            System.err.println("❌ 流式简化方法测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 测试依赖注入
     */
    private void testDependencyInjection() {
        System.out.println("\n--- 测试5: 依赖注入 ---");

        // 验证 @Resource 注入的 SparkConfig
        if (sparkConfig != null) {
            System.out.println("✅ @Resource SparkConfig 注入成功");
            System.out.println("  注入的配置 - 模型: " + sparkConfig.getModel());
            System.out.println("  注入的配置 - API Key: " + maskApiKey(sparkConfig.getApiKey()));
        } else {
            System.err.println("❌ @Resource SparkConfig 注入失败");
        }

        // 验证 @Autowired 注入的 SparkClient
        if (sparkClient != null) {
            System.out.println("✅ @Autowired SparkClient 注入成功");

            try {
                // 使用注入的客户端进行测试
                String content = sparkClient.chatForContent("测试依赖注入，请简短回复");
                System.out.println("✅ 使用注入的 SparkClient 调用成功");
                System.out.println("回复: " + content);

            } catch (SparkClientException e) {
                System.err.println("❌ 使用注入的 SparkClient 调用失败: " + e.getMessage());
            }
        } else {
            System.err.println("❌ @Autowired SparkClient 注入失败");
        }
    }

    /**
     * 掩码 API Key 用于显示
     */
    private String maskApiKey(String apiKey) {
        if (apiKey == null || apiKey.length() < 8) {
            return "****";
        }
        return apiKey.substring(0, 4) + "****" + apiKey.substring(apiKey.length() - 4);
    }
}
